МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Звіт
про виконання лабораторної роботи №2
з курсу
“ Програмування комп’ютерної графіки”
Львів-2011
Мета роботи:
Набути практичних навиків в складанні програми для побудови графіків в середовищі Microsoft Visual Studio C++ 2008.
Завдання:
Написати програму, яка будує в середині екрану систему координат ХY і на ній графік функції Y=F(X), якщо аргумент або параметр змінюється на проміжку [a,b], з кроком h.
Задана функція:
X=7*(cos(t)-t*sin(t)+pow(cos(t),3))-50*sin(t/4);
Y=7*(sin(t)-t*cos(t)+pow(sin(t),3))-50*cos(t/4);
Список ідентифікаторів констант, змінних, процедур і функцій, використаних в програмі, та їх пояснення
dXmash, dYmash – змінні які відповідають за розширення екрану;
dXreal, dYreal – змінні які відповідають за різницю між максимальним і мінімальним значеннями координат відповідних осей;
Xmash, Ymash – поточні машинні координати;
Kx, Ky – коефіцієнти розширення;
Y0mash, X0mash – відносний початок машинних координатж;
Xmax, Xmin, Ymax, Ymin – максимальні та мінімальні значення функцій відповідних координат;
Y, X – значення функційж;
t – параметр функцій, який змінюється на інтервалі [1,17];
i – змінна, за допомогою якої здійснюється проставляння засічок на осях;
h – крок зміни параметра t;
У програмі використано оператори умовності if та for. А також команди для створення користувацького пера типу:
CPen red_pen;
red_pen.CreatePen (PS_SOLID, 2, RGB (255, 0, 0));
dc.SelectObject(&red_pen);
Остаточна версія програми:
void CChildView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
// Do not call CWnd::OnPaint() for painting messages
double i, t, dXreal, dYreal, Kx, Ky, Xmash, Ymash, dXmash=900, dYmash=600, X0mash=640, Y0mash=500, Xmax=-10000, Xmin=10000, Ymax=-10000, Ymin=10000, h=0.01, X, Y;
//Знаходження коефіцієнтів перетворення:
for (t=1; t<=17; t=t+h)
{
X=7*(cos(t)-t*sin(t)+pow(cos(t),3))-50*sin(t/4);
Y=7*(sin(t)-t*cos(t)+pow(sin(t),3))-50*cos(t/4);
if (Xmax<X)
Xmax=X;
if (Xmin>X)
Xmin=X;
if (Ymax<Y)
Ymax=Y;
if (Ymin>Y)
Ymin=Y;
}
dXreal=Xmax-Xmin;
dYreal=Ymax-Ymin;
Kx=dXmash/dXreal;
Ky=dYmash/dYreal;
Xmash=X0mash+X*Kx;
Ymash=Y0mash-Y*Ky;
//Малюємо вісь x:
dc.MoveTo (X0mash-620, Y0mash);
dc.LineTo (X0mash+620, Y0mash);
//Малюємо стрілку на осі х:
dc.MoveTo (X0mash+620, Y0mash);
dc.LineTo (X0mash+615, Y0mash-5);
dc.MoveTo (X0mash+620, Y0mash);
dc.LineTo (X0mash+615, Y0mash+5);
//Малюємо вісь у:
dc.MoveTo (X0mash, Y0mash-500);
dc.LineTo (X0mash, Y0mash+300);
//Малюємо стрілку на осі у:
dc.MoveTo (X0mash, Y0mash-500);
dc.LineTo (X0mash-5, Y0mash-495);
dc.MoveTo (X0mash, Y0mash-500);
dc.LineTo (X0mash+5, Y0mash-495);
//Будуємо графік:
t=1;
X=7*(cos(t)-t*sin(t)+pow(cos(t),3))-50*sin(t/4);
Y=7*(sin(t)-t*cos(t)+pow(sin(t),3))-50*cos(t/4);
Xmash=X0mash+X*Kx;
Ymash=Y0mash-Y*Ky;
dc.MoveTo (Xmash, Ymash);
//Cтворюємо користувацьке перо червоного кольору, для того, щоб виділити графік:
CPen red_pen;
red_pen.CreatePen (PS_SOLID, 2, RGB (255, 0, 0));
dc.SelectObject(&red_pen);
for (t=1; t<=17; t=t+h)
{
X=7*(cos(t)-t*sin(t)+pow(cos(t),3))-50*sin(t/4);
Y=7*(sin(t)-t*cos(t)+pow(sin(t),3))-50*cos(t/4);
Xmash=X0mash+X*Kx;
Ymash=Y0mash-Y*Ky;
dc.LineTo (Xmash, Ymash);
}
//Знову переходимо до стандартного пера:
CPen black;
black.CreatePen (PS_SOLID, 1, RGB (0, 0, 0));
dc.SelectObject(&black);
//Робимо засічки на осі х:
for (i=-160; i<=160; i=i+20)
{
dc.MoveTo (X0mash+i*Kx, Y0mash-3);
dc.LineTo (X0mash+i*Kx, Y0mash+3);
}
//Робимо засічки на осі у:
for (i=-140; i<=160; i=i+20)
{
dc.MoveTo (X0mash-3, Y0mash+i*Ky);
dc.LineTo (X0mash+3, Y0mash+i*Ky);
}
//Підписуємо вісь х:
const CString X0("0");
dc.TextOutW(X0mash-10,Y0mash+10, X0);
const CString X1("-160");
dc.TextOutW(X0mash-165*Kx,Y0mash+10, X1);
...